import os
import sys
import subprocess

# 检查并安装必要包
required_packages = ['pandas', 'matplotlib']

def install_packages():
    for package in required_packages:
        try:
            __import__(package)
        except ImportError:
            print(f'Installing {package}...')
            subprocess.check_call([sys.executable, '-m', 'pip', 'install', package])

install_packages()

import pandas as pd
import matplotlib.pyplot as plt
import os
import matplotlib

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 读取CSV文件
data = pd.read_csv('d:\\summer-internship\\summer-internship-project\\project\\练习一\\project周瑞\\A公司矿粉水泥货运数据.csv', encoding='utf-8')

# 创建输出目录
output_dir = 'd:\\summer-internship\\summer-internship-project\\project\\练习一\\project周瑞\\analysis_results'
os.makedirs(output_dir, exist_ok=True)

# 1. 按日统计水泥和矿粉净重
data['创建时间'] = pd.to_datetime(data['创建时间'])
data['日期'] = data['创建时间'].dt.date

daily_stats = data.groupby(['日期', '货品'])['净重'].sum().unstack()

# 绘制日水泥货运量柱状图
plt.figure(figsize=(12, 6))
daily_stats['水泥'].plot(kind='bar', color='blue')
plt.title('Daily Cement Shipment Weight')
plt.xlabel('Date')
plt.ylabel('Weight (ton)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(os.path.join(output_dir, 'daily_cement.png'))
plt.close()

# 绘制日矿粉货运量柱状图
plt.figure(figsize=(12, 6))
daily_stats['矿粉'].plot(kind='bar', color='orange')
plt.title('Daily Mineral Powder Shipment Weight')
plt.xlabel('Date')
plt.ylabel('Weight (ton)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(os.path.join(output_dir, 'daily_mineral_powder.png'))
plt.close()

# 2. 按客户统计净重和
customer_stats = data.groupby('客户')['净重'].sum().sort_values(ascending=False)

# 绘制客户净重饼图
plt.figure(figsize=(10, 10))
plt.pie(customer_stats, labels=customer_stats.index, autopct='%1.1f%%', textprops={'fontsize': 10})
plt.title('Customer Shipment Weight Distribution')
plt.tight_layout()
plt.savefig(os.path.join(output_dir, 'customer_distribution.png'))
plt.close()

# 3. 按发货地统计净重和
location_stats = data.groupby('发货地')['净重'].sum().sort_values(ascending=False)

# 绘制发货地净重扇形图
plt.figure(figsize=(10, 10))
plt.pie(location_stats, labels=location_stats.index, autopct='%1.1f%%', wedgeprops=dict(width=0.3), textprops={'fontsize': 8})
plt.title('Shipment Location Weight Distribution')
plt.tight_layout()
plt.savefig(os.path.join(output_dir, 'location_distribution.png'))
plt.close()

# 4. 按车牌号统计净重和
vehicle_stats = data.groupby('车辆')['净重'].sum().sort_values(ascending=False)

# 绘制车牌号净重环形图
plt.figure(figsize=(10, 10))
plt.pie(vehicle_stats, labels=vehicle_stats.index, autopct='%1.1f%%', wedgeprops=dict(width=0.4), textprops={'fontsize': 8})
plt.title('Vehicle Shipment Weight Distribution')
plt.tight_layout()
plt.savefig(os.path.join(output_dir, 'vehicle_distribution.png'))
plt.close()

# 生成详细统计报告
report_content = """# A公司货运数据统计性分析报告

## 1. 数据概览

- 总记录数: {}
- 总货运量: {} 吨
- 平均每日货运量: {} 吨
- 数据时间范围: {} 至 {}

## 2. 每日货运量分析

![每日水泥货运量](daily_cement.png)
![每日矿粉货运量](daily_mineral_powder.png)

### 关键发现:
- 最高水泥货运日: {} ({} 吨)
- 最低水泥货运日: {} ({} 吨)
- 最高矿粉货运日: {} ({} 吨)
- 最低矿粉货运日: {} ({} 吨)

## 3. 客户分析

![客户货运量分布](customer_distribution.png)

### 主要客户分析:
1. **{}**: {} 吨 (占比{:.1%})
2. **{}**: {} 吨 (占比{:.1%})
3. **{}**: {} 吨 (占比{:.1%})

## 4. 发货地分析

![发货地货运量分布](location_distribution.png)

### 主要发货地:
1. **{}**: {} 吨
2. **{}**: {} 吨
3. **{}**: {} 吨

## 5. 运输车辆分析

![车辆货运量分布](vehicle_distribution.png)

### 高效运输车辆:
- 最高效车辆: {} ({} 吨)
- 平均每车货运量: {:.1f} 吨

## 6. 业务模式分析

- 自提业务占比: {:.1%}
- 配送业务占比: {:.1%}

## 7. 建议

1. 针对高需求客户可考虑长期合作协议
2. 优化高峰日运输资源配置
3. 分析高效车辆运营模式并推广
""".format(
    len(data), 
    data['净重'].sum(), 
    data['净重'].sum()/len(daily_stats),
    data['创建时间'].min().date(), 
    data['创建时间'].max().date(),
    daily_stats['水泥'].idxmax(), daily_stats['水泥'].max(),
    daily_stats['水泥'].idxmin(), daily_stats['水泥'].min(),
    daily_stats['矿粉'].idxmax(), daily_stats['矿粉'].max(),
    daily_stats['矿粉'].idxmin(), daily_stats['矿粉'].min(),
    customer_stats.index[0], customer_stats[0], customer_stats[0]/customer_stats.sum(),
    customer_stats.index[1], customer_stats[1], customer_stats[1]/customer_stats.sum(),
    customer_stats.index[2], customer_stats[2], customer_stats[2]/customer_stats.sum(),
    location_stats.index[0], location_stats[0],
    location_stats.index[1], location_stats[1],
    location_stats.index[2], location_stats[2],
    vehicle_stats.index[0], vehicle_stats[0],
    vehicle_stats.mean(),
    len(data[data['业务'].str.contains('自提')])/len(data),
    len(data[data['业务'].str.contains('配送')])/len(data)
)

with open(os.path.join(output_dir, 'report.md'), 'w', encoding='utf-8') as f:
    f.write(report_content)